package com.personal.gateway.custom.customEnum.flinkCommandEnum;

import com.personal.gateway.flinkAllCommand.configurationOption.ConfigurationOption;
import com.personal.gateway.flinkAllCommand.configurationOption.configurationType.ConfigurationTypeEnumInterface;

import javax.annotation.Nonnull;

/**
 * @author BigHead
 * @date 2022/1/20 16:59
 * @description FlinkMetricsEnum
 */
public enum FlinkMetricsEnum implements ConfigurationTypeEnumInterface {
    /**
     * JMX（Java Management Extensions，即Java管理扩展）
     */
    JMX("JMX", "metrics.reporter.jmx.factory.class=org.apache.flink.metrics.jmx.JMXReporterFactory"),
    /**
     * Graphite是一个开源实时的、显示时间序列度量数据的图形系统
     */
    GRAPHITE("Graphite", "metrics.reporter.grph.factory.class=org.apache.flink.metrics.graphite.GraphiteReporterFactory"),
    /**
     * InfluxDB是一个由InfluxData开发的开源时序型数据
     */
    INFLUXDB("InfluxDB", "metrics.reporter.influxdb.factory.class=org.apache.flink.metrics.influxdb.InfluxdbReporterFactory"),
    /**
     * Prometheus是一个开源的系统监控和报警系统
     */
    PROMETHEUS("Prometheus", ""),
    /**
     * Prometheus是一个开源的系统监控和报警系统
     */
    PROMETHEUS_PUSH_GATEWAY("PrometheusPushGateway", ""),
    /**
     * StatsD 是一个简单的网络守护进程，基于 Node.js 平台，通过 UDP 或者 TCP 方式侦听各种统计信息，包括计数器和定时器，并发送聚合信息到后端服务
     */
    STATSD("StatsD", ""),
    /**
     * Datadog 是 SaaS 监测工具，针对 DevOps 团队，从你的 app 或者其他各种工具获取数据并提供数据可视化功能
     */
    DATADOG("Datadog", ""),
    /**
     * 日志监控工具
     */
    SLF4J("Slf4j", "");


    public final static Class<Enum<? extends ConfigurationTypeEnumInterface>> FLINK_METRICS_ENUM_TYPE_CLASS = (Class<Enum<? extends ConfigurationTypeEnumInterface>>) (Class<?>) FlinkMetricsEnum.class;
    private final String metricsName;
    private final String flinkUseMetricsCommand;

    FlinkMetricsEnum(String metricsName, String flinkUseMetricsCommand) {
        this.metricsName = metricsName;
        this.flinkUseMetricsCommand = flinkUseMetricsCommand;
    }

    @Override
    public String getShowValue() {
        return name();
    }

    @Override
    public String getSelectValue() {
        return metricsName;
    }

    @Override
    public boolean checkExist(@Nonnull String... values) {
        if (values.length == 1){
            return metricsName.equals(values[0]);
        }
        return false;
    }

    @Override
    public boolean checkExist(ConfigurationOption<?, ?> configurationOption, @Nonnull String... values) {
        return false;
    }

    @Override
    public boolean checkExampleValue(ConfigurationOption<?, ?> configurationOption) {
        return false;
    }
}
